﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Model;
using DAL.Persistence;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Persistence
{
    /// <summary>
    /// Classe responsável pelas transações de produtos no banco de dados
    /// </summary>
    public class ProdutoDAL : DAL
    {
        /// <summary>
        /// Método para cadastrar um produto no banco
        /// </summary>
        /// <param name="p">O produto a ser cadastrado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Salvar(Produto p)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("CadastrarProduto", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@Nome", p.Nome);
                comando.Parameters.AddWithValue("@Preco", p.Preco);
                comando.Parameters.AddWithValue("@Quantidade", p.Quantidade);
                comando.Parameters.AddWithValue("@Categoria", 1);
                comando.Parameters.AddWithValue("@Marca", p.FkMarca);

                if (comando.ExecuteNonQuery() > 0)
                    return "Produto cadastrado com sucesso";
                else
                    throw new Exception();
            }
            catch (SqlException ex)
            {
                return ex.Message;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Lista todos os produtos do banco de dados
        /// </summary>
        /// <returns></returns>
        public List<Produto> Listar(string nome)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarProduto", conexao);
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@Nome", nome);

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader

                List<Produto> listaDeProdutos = new List<Produto>();

                //percorrer o DataReader
                while(dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    Produto p = new Produto();

                    //Ler os campos do banco para dentro do objeto Produto
                    p.IdProduto = Convert.ToInt32(dr["CODIGO"]);
                    p.Nome = Convert.ToString(dr["NOME"]);
                    p.Preco = Convert.ToDecimal(dr["PRECO"]);
                    p.Quantidade = Convert.ToInt32(dr["QUANTIDADE"]);
                    p.FkCategoria = Convert.ToInt32(dr["CATEGORIA"]);
                    p.FkMarca = Convert.ToInt32(dr["MARCA"]);

                    listaDeProdutos.Add(p);
                }

                return listaDeProdutos;
            }
            catch
            {
                return null;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Retorna um produto do banco de dados baseado na ID
        /// </summary>
        /// <param name="id">o ID do produto</param>
        /// <returns>O Produto</returns>
        public Produto ConsultaProdutoPorID(int id)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarProdutoPorID", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader               

                Produto p = null;
                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    p = new Produto();

                    //Ler os campos do banco para dentro do objeto Produto
                    p.IdProduto = Convert.ToInt32(dr["CODIGO"]);
                    p.Nome = Convert.ToString(dr["NOME"]);
                    p.Preco = Convert.ToDecimal(dr["PRECO"]);
                    p.Quantidade = Convert.ToInt32(dr["QUANTIDADE"]);
                    p.FkCategoria = Convert.ToInt32(dr["CATEGORIA"]);
                    p.FkMarca = Convert.ToInt32(dr["MARCA"]);
                }

                return p;

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                FecharConexao();
            }
        }   

        /// <summary>
        /// Atualiza um produto do banco de dados
        /// </summary>
        /// <param name="p">O produto a ser alterado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Atualizar(Produto p)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("AtualizarProduto", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdProduto", p.IdProduto);
                comando.Parameters.AddWithValue("@Nome", p.Nome);
                comando.Parameters.AddWithValue("@Preco", p.Preco);
                comando.Parameters.AddWithValue("@Quantidade", p.Quantidade);
                comando.Parameters.AddWithValue("@Categoria", p.FkCategoria);
                comando.Parameters.AddWithValue("@Marca", p.FkMarca);


                if (comando.ExecuteNonQuery() > 0)
                    return "Produto atualizado com sucesso";
                else
                    throw new Exception("Erro. Produto nao localizado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Exclui o produto do banco, usando o ID
        /// </summary>
        /// <param name="IdProduto">o ID do produto a ser excluido</param>
        /// <returns>Uma mensagem com o status da operação</returns>
        public string Excluir(int IdProduto)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ExcluirProduto", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdProduto", IdProduto);

                if (comando.ExecuteNonQuery() > 0)
                    return "Produto excluído com sucesso";
                else
                    throw new Exception("Erro. Produto nao encontrado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }
    }
}
